﻿
using System;
using System.Collections;
using System.IO;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.ДокументыСсылка;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.ДокументыСсылка
{
	///<summary>
	///(Регл)
	///</summary>
	[ProtoContract]
	[DataContract]
	public partial class ОтпускПоУходуЗаРебенком:ДокументСсылка,IСериализаторProtoBuf,IСериализаторJson
	{
		public static readonly Guid ГуидКласса = new Guid("dd4784fd-b192-4088-b459-6dab78b7cca2");
		public static readonly DateTime ВерсияКласса = DateTime.ParseExact("20120928012016.000", new string[] {"yyyyMMddHHmmss.fff"}, CultureInfo.InvariantCulture, DateTimeStyles.None);
		public static readonly long КонтрольнаяСуммаКласса = 123;
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		public bool ПометкаУдаления {get;set;}
		public DateTime Дата {get;set;}
		public DateTime ПрефиксНомера {get;set;}
		public string/*11*/ Номер {get;set;}
		public bool Проведен {get;set;}
		public V82.СправочникиСсылка.Организации Организация {get;set;}
		///<summary>
		///Любая дополнительная информация
		///</summary>
		public string/*(0)*/ Комментарий {get;set;}
		public V82.СправочникиСсылка.Пользователи Ответственный {get;set;}
		public V82.СправочникиСсылка.СотрудникиОрганизаций Сотрудник {get;set;}
		public V82.СправочникиСсылка.ФизическиеЛица Физлицо {get;set;}//Физическое лицо
		public DateTime ДатаДействия {get;set;}//Дата действия
		public DateTime ДатаНачала {get;set;}//Дата начала
		public DateTime ДатаОкончания {get;set;}//Дата окончания
		public DateTime ДатаОкончанияПособияДоПолутораЛет {get;set;}//Дата окончания пособия до полутора лет
		public DateTime ДатаОкончанияПособияДоТрехЛет {get;set;}//Дата окончания пособия до трех лет
		public decimal/*(15.2)*/ СреднедневнойЗаработок {get;set;}//Среднедневной заработок
		public decimal/*(2)*/ КоличествоДетей {get;set;}//Количество детей
		public decimal/*(1)*/ КоличествоПервыхДетей {get;set;}//Количество первых детей
		public bool ВыплачиватьПособиеДоПолутораЛет {get;set;}//Выплачивать пособие до полутора лет
		public bool ВыплачиватьПособиеДоТрехЛет {get;set;}//Выплачивать пособие до трех лет
		public V82.ДокументыСсылка.ПриемНаРаботуВОрганизацию УдалитьПриказ {get;set;}//Удалить приказ
		public bool ОсвобождатьСтавку {get;set;}//Освобождать ставку
		public bool ДанныеПрошлойВерсии {get;set;}//Перенесен из 7.7
		public V82.ДокументыСсылка.ОтпускПоУходуЗаРебенком ИсправляемыйДокумент {get;set;}//Исправляемый документ
		public ХранилищеЗначения ДвиженияИсправляемогоДокумента {get;set;}//Движения исправляемого документа
		///<summary>
		///Дата начала расчетного периода
		///</summary>
		public DateTime ПериодРасчетаСреднегоЗаработкаНачало {get;set;}//Период расчета среднего заработка начало
		///<summary>
		///Дата окончания расчетного периода
		///</summary>
		public DateTime ПериодРасчетаСреднегоЗаработкаОкончание {get;set;}//Период расчета среднего заработка окончание
		public bool ПрименятьЛьготыПриНачисленииПособия {get;set;}//Применять льготы при начислении пособия
		public decimal/*(15.2)*/ СреднедневнойЗаработокПереходногоПериода2010 {get;set;}//Среднедневной заработок переходного периода - 2010
		public bool УчитыватьЗаработокПредыдущихСтрахователей {get;set;}//Учитывать заработок предыдущих страхователей
		public bool РасчетПоПравилам2010Года {get;set;}//Расчет по правилам 2010 года
		public bool ПеречислятьПособиеПочтовымПереводом {get;set;}//Перечислять пособие почтовым переводом
		public V82.СправочникиСсылка.Банки Банк {get;set;}
		public string/*(100)*/ НаименованиеБанка {get;set;}//Наименование банка
		public string/*(9)*/ БИКБанка {get;set;}//БИК банка
		public string/*(20)*/ НомерЛицевогоСчета {get;set;}//Номер лицевого счета
		public string/*(240)*/ АдресПочтовый {get;set;}//Адрес почтовый
		///<summary>
		///(Общ)
		///</summary>
		public string/*(40)*/ Фамилия {get;set;}
		///<summary>
		///(Общ)
		///</summary>
		public string/*(40)*/ Имя {get;set;}
		///<summary>
		///(Общ)
		///</summary>
		public string/*(40)*/ Отчество {get;set;}
		public V82.СправочникиСсылка.ДокументыУдостоверяющиеЛичность ВидДокумента {get;set;}//Вид документа
		public string/*(14)*/ СерияДокумента {get;set;}//Серия документа
		public string/*(14)*/ НомерДокумента {get;set;}//Номер документа
		public DateTime ДатаВыдачиДокумента {get;set;}//Дата выдачи документа
		public DateTime ДатаДействияДокумента {get;set;}//Дата действия документа
		public V82.СправочникиСсылка.ДолжностиОрганизаций ДолжностьУполномоченного {get;set;}//Должность уполномоченного
		public V82.СправочникиСсылка.ФизическиеЛица Уполномоченный {get;set;}
		public string/*(240)*/ АдресРегистрации {get;set;}//Адрес регистрации
		public DateTime ДатаСправкиОНеполученииПособияОтОтца {get;set;}//Дата справки о неполучении пособия от отца
		public string/*(20)*/ НомерСправкиОНеполученииПособияОтОтца {get;set;}//Номер справки о неполучении пособия от отца
		public DateTime ДатаСправкиОНеполученииПособияОтМатери {get;set;}//Дата справки о неполучении пособия от матери
		public string/*(20)*/ НомерСправкиОНеполученииПособияОтМатери {get;set;}//Номер справки о неполучении пособия от матери
		public bool ПроживаниеРаботаВЛьготнойЗоне {get;set;}//Проживание работа в льготной зоне
		public V82.Перечисления/*Ссылка*/.ВидыЗонРадиационногоПоражения СтатусЛьготнойЗоны {get;set;}//Статус льготной зоны
		public DateTime ДатаСправкиПоДругимМестамРаботы {get;set;}//Дата справки по другим местам работы
		public string/*(20)*/ НомерСправкиПоДругимМестамРаботы {get;set;}//Номер справки по другим местам работы
		public string/*(0)*/ КемВыданДокумент {get;set;}//Кем выдан документ
		public DateTime ДатаВыдачиДокументаНаПроживание {get;set;}//Дата выдачи документа на проживание
		public string/*(14)*/ НомерДокументаНаПроживание {get;set;}//Номер документа на проживание
		public string/*(14)*/ СерияДокументаНаПроживание {get;set;}//Серия документа на проживание
		public string/*(100)*/ НаименованиеДокументаНаПроживание {get;set;}//Наименование документа на проживание
		///<summary>
		///Корреспонденский счет банка
		///</summary>
		public string/*(20)*/ КоррСчетБанка {get;set;}//Корр. счет банка
		public string/*(15)*/ Телефон {get;set;}
		public bool РасчетПособияИзТарифнойСтавки {get;set;}//Расчет пособия из тарифной ставки
		public decimal/*(15.2)*/ ТарифнаяСтавкаОклад {get;set;}//Тарифная ставка оклад
		public string/*(30)*/ ТелефонСоставителя {get;set;}//Телефон составителя
		public string/*(17)*/ АдресПочтовыйКодПоКЛАДР {get;set;}//Адрес почтовый код по КЛАДР
		
		public ОтпускПоУходуЗаРебенком()
		{
		}
		
		public ОтпускПоУходуЗаРебенком(byte[] УникальныйИдентификатор)
		{
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Select top 1 
					_IDRRef [Ссылка]
					,_Version [Версия]
					,_Marked [ПометкаУдаления]
					,_Number [Номер]
					,_Fld6981RRef [Организация]
					,_Fld6982 [Комментарий]
					,_Fld6983RRef [Ответственный]
					,_Fld21717RRef [Сотрудник]
					,_Fld6984RRef [Физлицо]
					,_Fld6986 [ДатаДействия]
					,_Fld6987 [ДатаНачала]
					,_Fld6988 [ДатаОкончания]
					,_Fld18781 [ДатаОкончанияПособияДоПолутораЛет]
					,_Fld18782 [ДатаОкончанияПособияДоТрехЛет]
					,_Fld18783 [СреднедневнойЗаработок]
					,_Fld18784 [КоличествоДетей]
					,_Fld18785 [КоличествоПервыхДетей]
					,_Fld18786 [ВыплачиватьПособиеДоПолутораЛет]
					,_Fld18787 [ВыплачиватьПособиеДоТрехЛет]
					,_Fld6985RRef [УдалитьПриказ]
					,_Fld23003 [ОсвобождатьСтавку]
					,_Fld27075 [ДанныеПрошлойВерсии]
					,_Fld27076RRef [ИсправляемыйДокумент]
					,_Fld27077 [ДвиженияИсправляемогоДокумента]
					,_Fld27078 [ПериодРасчетаСреднегоЗаработкаНачало]
					,_Fld27079 [ПериодРасчетаСреднегоЗаработкаОкончание]
					,_Fld27080 [ПрименятьЛьготыПриНачисленииПособия]
					,_Fld27081 [СреднедневнойЗаработокПереходногоПериода2010]
					,_Fld27082 [УчитыватьЗаработокПредыдущихСтрахователей]
					,_Fld27083 [РасчетПоПравилам2010Года]
					,_Fld27084 [ПеречислятьПособиеПочтовымПереводом]
					,_Fld27085RRef [Банк]
					,_Fld27086 [НаименованиеБанка]
					,_Fld27087 [БИКБанка]
					,_Fld27088 [НомерЛицевогоСчета]
					,_Fld27089 [АдресПочтовый]
					,_Fld27090 [Фамилия]
					,_Fld27091 [Имя]
					,_Fld27092 [Отчество]
					,_Fld27093RRef [ВидДокумента]
					,_Fld27094 [СерияДокумента]
					,_Fld27095 [НомерДокумента]
					,_Fld27096 [ДатаВыдачиДокумента]
					,_Fld27097 [ДатаДействияДокумента]
					,_Fld27098RRef [ДолжностьУполномоченного]
					,_Fld27099RRef [Уполномоченный]
					,_Fld27100 [АдресРегистрации]
					,_Fld27101 [ДатаСправкиОНеполученииПособияОтОтца]
					,_Fld27102 [НомерСправкиОНеполученииПособияОтОтца]
					,_Fld27103 [ДатаСправкиОНеполученииПособияОтМатери]
					,_Fld27104 [НомерСправкиОНеполученииПособияОтМатери]
					,_Fld27105 [ПроживаниеРаботаВЛьготнойЗоне]
					,_Fld27106RRef [СтатусЛьготнойЗоны]
					,_Fld27107 [ДатаСправкиПоДругимМестамРаботы]
					,_Fld27108 [НомерСправкиПоДругимМестамРаботы]
					,_Fld27109 [КемВыданДокумент]
					,_Fld27110 [ДатаВыдачиДокументаНаПроживание]
					,_Fld27111 [НомерДокументаНаПроживание]
					,_Fld27112 [СерияДокументаНаПроживание]
					,_Fld27113 [НаименованиеДокументаНаПроживание]
					,_Fld27114 [КоррСчетБанка]
					,_Fld27115 [Телефон]
					,_Fld27116 [РасчетПособияИзТарифнойСтавки]
					,_Fld27117 [ТарифнаяСтавкаОклад]
					,_Fld27118 [ТелефонСоставителя]
					,_Fld27119 [АдресПочтовыйКодПоКЛАДР]
					From _Document346(NOLOCK)
					Where _IDRRef=@УникальныйИдентификатор";
					Команда.Parameters.AddWithValue("УникальныйИдентификатор", УникальныйИдентификатор);
					using (var Читалка = Команда.ExecuteReader())
					{
						if (Читалка.Read())
						{
							//ToDo: Читать нужно через GetValues()
							Ссылка = new Guid((byte[])Читалка.GetValue(0));
							var ПотокВерсии = ((byte[])Читалка.GetValue(1));
							Array.Reverse(ПотокВерсии);
							Версия =  BitConverter.ToInt64(ПотокВерсии, 0);
							ВерсияДанных =  Convert.ToBase64String(ПотокВерсии);
							ПометкаУдаления = ((byte[])Читалка.GetValue(2))[0]==1;
							Номер = Читалка.GetString(3);
							Комментарий = Читалка.GetString(5);
							ДатаДействия = Читалка.GetDateTime(9);
							ДатаНачала = Читалка.GetDateTime(10);
							ДатаОкончания = Читалка.GetDateTime(11);
							ДатаОкончанияПособияДоПолутораЛет = Читалка.GetDateTime(12);
							ДатаОкончанияПособияДоТрехЛет = Читалка.GetDateTime(13);
							СреднедневнойЗаработок = Читалка.GetDecimal(14);
							КоличествоДетей = Читалка.GetDecimal(15);
							КоличествоПервыхДетей = Читалка.GetDecimal(16);
							ВыплачиватьПособиеДоПолутораЛет = ((byte[])Читалка.GetValue(17))[0]==1;
							ВыплачиватьПособиеДоТрехЛет = ((byte[])Читалка.GetValue(18))[0]==1;
							УдалитьПриказ = new V82.ДокументыСсылка.ПриемНаРаботуВОрганизацию((byte[])Читалка.GetValue(19));
							ОсвобождатьСтавку = ((byte[])Читалка.GetValue(20))[0]==1;
							ДанныеПрошлойВерсии = ((byte[])Читалка.GetValue(21))[0]==1;
							ИсправляемыйДокумент = new V82.ДокументыСсылка.ОтпускПоУходуЗаРебенком((byte[])Читалка.GetValue(22));
							ПериодРасчетаСреднегоЗаработкаНачало = Читалка.GetDateTime(24);
							ПериодРасчетаСреднегоЗаработкаОкончание = Читалка.GetDateTime(25);
							ПрименятьЛьготыПриНачисленииПособия = ((byte[])Читалка.GetValue(26))[0]==1;
							СреднедневнойЗаработокПереходногоПериода2010 = Читалка.GetDecimal(27);
							УчитыватьЗаработокПредыдущихСтрахователей = ((byte[])Читалка.GetValue(28))[0]==1;
							РасчетПоПравилам2010Года = ((byte[])Читалка.GetValue(29))[0]==1;
							ПеречислятьПособиеПочтовымПереводом = ((byte[])Читалка.GetValue(30))[0]==1;
							НаименованиеБанка = Читалка.GetString(32);
							БИКБанка = Читалка.GetString(33);
							НомерЛицевогоСчета = Читалка.GetString(34);
							АдресПочтовый = Читалка.GetString(35);
							Фамилия = Читалка.GetString(36);
							Имя = Читалка.GetString(37);
							Отчество = Читалка.GetString(38);
							СерияДокумента = Читалка.GetString(40);
							НомерДокумента = Читалка.GetString(41);
							ДатаВыдачиДокумента = Читалка.GetDateTime(42);
							ДатаДействияДокумента = Читалка.GetDateTime(43);
							АдресРегистрации = Читалка.GetString(46);
							ДатаСправкиОНеполученииПособияОтОтца = Читалка.GetDateTime(47);
							НомерСправкиОНеполученииПособияОтОтца = Читалка.GetString(48);
							ДатаСправкиОНеполученииПособияОтМатери = Читалка.GetDateTime(49);
							НомерСправкиОНеполученииПособияОтМатери = Читалка.GetString(50);
							ПроживаниеРаботаВЛьготнойЗоне = ((byte[])Читалка.GetValue(51))[0]==1;
							СтатусЛьготнойЗоны = V82.Перечисления/*Ссылка*/.ВидыЗонРадиационногоПоражения.ПустаяСсылка.Получить((byte[])Читалка.GetValue(52));
							ДатаСправкиПоДругимМестамРаботы = Читалка.GetDateTime(53);
							НомерСправкиПоДругимМестамРаботы = Читалка.GetString(54);
							КемВыданДокумент = Читалка.GetString(55);
							ДатаВыдачиДокументаНаПроживание = Читалка.GetDateTime(56);
							НомерДокументаНаПроживание = Читалка.GetString(57);
							СерияДокументаНаПроживание = Читалка.GetString(58);
							НаименованиеДокументаНаПроживание = Читалка.GetString(59);
							КоррСчетБанка = Читалка.GetString(60);
							Телефон = Читалка.GetString(61);
							РасчетПособияИзТарифнойСтавки = ((byte[])Читалка.GetValue(62))[0]==1;
							ТарифнаяСтавкаОклад = Читалка.GetDecimal(63);
							ТелефонСоставителя = Читалка.GetString(64);
							АдресПочтовыйКодПоКЛАДР = Читалка.GetString(65);
							//return Ссылка;
						}
						else
						{
							//return null;
						}
					}
				}
			}
		}
		
		public V82.ДокументыОбъект.ОтпускПоУходуЗаРебенком  ПолучитьОбъект()
		{
			var Объект = new V82.ДокументыОбъект.ОтпускПоУходуЗаРебенком();
			Объект._ЭтоНовый = false;
			Объект.Ссылка = Ссылка;
			Объект.Версия = Версия;
			Объект.ПометкаУдаления = ПометкаУдаления;
			Объект.Номер = Номер;
			Объект.Организация = Организация;
			Объект.Комментарий = Комментарий;
			Объект.Ответственный = Ответственный;
			Объект.Сотрудник = Сотрудник;
			Объект.Физлицо = Физлицо;
			Объект.ДатаДействия = ДатаДействия;
			Объект.ДатаНачала = ДатаНачала;
			Объект.ДатаОкончания = ДатаОкончания;
			Объект.ДатаОкончанияПособияДоПолутораЛет = ДатаОкончанияПособияДоПолутораЛет;
			Объект.ДатаОкончанияПособияДоТрехЛет = ДатаОкончанияПособияДоТрехЛет;
			Объект.СреднедневнойЗаработок = СреднедневнойЗаработок;
			Объект.КоличествоДетей = КоличествоДетей;
			Объект.КоличествоПервыхДетей = КоличествоПервыхДетей;
			Объект.ВыплачиватьПособиеДоПолутораЛет = ВыплачиватьПособиеДоПолутораЛет;
			Объект.ВыплачиватьПособиеДоТрехЛет = ВыплачиватьПособиеДоТрехЛет;
			Объект.УдалитьПриказ = УдалитьПриказ;
			Объект.ОсвобождатьСтавку = ОсвобождатьСтавку;
			Объект.ДанныеПрошлойВерсии = ДанныеПрошлойВерсии;
			Объект.ИсправляемыйДокумент = ИсправляемыйДокумент;
			Объект.ДвиженияИсправляемогоДокумента = ДвиженияИсправляемогоДокумента;
			Объект.ПериодРасчетаСреднегоЗаработкаНачало = ПериодРасчетаСреднегоЗаработкаНачало;
			Объект.ПериодРасчетаСреднегоЗаработкаОкончание = ПериодРасчетаСреднегоЗаработкаОкончание;
			Объект.ПрименятьЛьготыПриНачисленииПособия = ПрименятьЛьготыПриНачисленииПособия;
			Объект.СреднедневнойЗаработокПереходногоПериода2010 = СреднедневнойЗаработокПереходногоПериода2010;
			Объект.УчитыватьЗаработокПредыдущихСтрахователей = УчитыватьЗаработокПредыдущихСтрахователей;
			Объект.РасчетПоПравилам2010Года = РасчетПоПравилам2010Года;
			Объект.ПеречислятьПособиеПочтовымПереводом = ПеречислятьПособиеПочтовымПереводом;
			Объект.Банк = Банк;
			Объект.НаименованиеБанка = НаименованиеБанка;
			Объект.БИКБанка = БИКБанка;
			Объект.НомерЛицевогоСчета = НомерЛицевогоСчета;
			Объект.АдресПочтовый = АдресПочтовый;
			Объект.Фамилия = Фамилия;
			Объект.Имя = Имя;
			Объект.Отчество = Отчество;
			Объект.ВидДокумента = ВидДокумента;
			Объект.СерияДокумента = СерияДокумента;
			Объект.НомерДокумента = НомерДокумента;
			Объект.ДатаВыдачиДокумента = ДатаВыдачиДокумента;
			Объект.ДатаДействияДокумента = ДатаДействияДокумента;
			Объект.ДолжностьУполномоченного = ДолжностьУполномоченного;
			Объект.Уполномоченный = Уполномоченный;
			Объект.АдресРегистрации = АдресРегистрации;
			Объект.ДатаСправкиОНеполученииПособияОтОтца = ДатаСправкиОНеполученииПособияОтОтца;
			Объект.НомерСправкиОНеполученииПособияОтОтца = НомерСправкиОНеполученииПособияОтОтца;
			Объект.ДатаСправкиОНеполученииПособияОтМатери = ДатаСправкиОНеполученииПособияОтМатери;
			Объект.НомерСправкиОНеполученииПособияОтМатери = НомерСправкиОНеполученииПособияОтМатери;
			Объект.ПроживаниеРаботаВЛьготнойЗоне = ПроживаниеРаботаВЛьготнойЗоне;
			Объект.СтатусЛьготнойЗоны = СтатусЛьготнойЗоны;
			Объект.ДатаСправкиПоДругимМестамРаботы = ДатаСправкиПоДругимМестамРаботы;
			Объект.НомерСправкиПоДругимМестамРаботы = НомерСправкиПоДругимМестамРаботы;
			Объект.КемВыданДокумент = КемВыданДокумент;
			Объект.ДатаВыдачиДокументаНаПроживание = ДатаВыдачиДокументаНаПроживание;
			Объект.НомерДокументаНаПроживание = НомерДокументаНаПроживание;
			Объект.СерияДокументаНаПроживание = СерияДокументаНаПроживание;
			Объект.НаименованиеДокументаНаПроживание = НаименованиеДокументаНаПроживание;
			Объект.КоррСчетБанка = КоррСчетБанка;
			Объект.Телефон = Телефон;
			Объект.РасчетПособияИзТарифнойСтавки = РасчетПособияИзТарифнойСтавки;
			Объект.ТарифнаяСтавкаОклад = ТарифнаяСтавкаОклад;
			Объект.ТелефонСоставителя = ТелефонСоставителя;
			Объект.АдресПочтовыйКодПоКЛАДР = АдресПочтовыйКодПоКЛАДР;
			return Объект;
		}
		
		private static readonly Hashtable Кэш = new Hashtable(1000);
		
		public static V82.ДокументыСсылка.ОтпускПоУходуЗаРебенком ВзятьИзКэша(byte[] УникальныйИдентификатор)
		{
			var УИ = new Guid(УникальныйИдентификатор);
			if (Кэш.ContainsKey(УИ))
			{
				return (V82.ДокументыСсылка.ОтпускПоУходуЗаРебенком)Кэш[УИ];
			}
			var Ссылка = new V82.ДокументыСсылка.ОтпускПоУходуЗаРебенком(УникальныйИдентификатор);
			Кэш.Add(УИ, Ссылка);
			return Ссылка;
		}
		
		public void СериализацияProtoBuf(Stream Поток)
		{
			Serializer.Serialize(Поток,this);
		}
		
		public string СериализацияJson()
		{
			return this.ToJson();
		}
		
		public string СериализацияXml()
		{
			return this.ToXml();
		}
	}
}